# 单纯的重复，不是迭代
"""
name = "刘超"
while True:
    print(name)
"""

# 迭代是一重复的过程，每一次重复都是基于上一次的结果而来
"""
l = ['a','b','c']
i = 0
while i < len(l):
    print(l[i])
    i+=1        # 循环变量自增，不然会是死循环
"""
# 哪些数据类型需要这样迭代取值
# 字符串、列表、元组、集合、字典
"""
a = "abc"
tuple1 = ('a','b','c')
i = 0
while i <len(tuple1):
    print(tuple1[i])
    i+=1
"""
# 集合、字典是不支持索引的，所以没办法通过while进行索引遍历访问
"""
set1 = {1,2,3}
for i in set1:
    print(i)
"""
# 可迭代对象：字符串、列表、元组、集合、字典
# 不可迭代对象：整数、浮点型
"""
a = 1
# a.__iter__()    # 整数类型不支持创建
b = 1.1
# b.__iter__()  # 浮点型不支持创建迭代器
c = 'hello'
# c.__iter__()      # 字符串支持创建迭代器
d = ['a','c']
# d.__iter__()    # 列表支持创建迭代器
e = (11,22)
# e.__iter__()    # 元组支持创建迭代器
f = {11,22,33}
# f.__iter__()    # 集合支持创建迭代器
g = {"name":"刘超",'age':101}
# g.__iter__()    # 字典也支持创建迭代器
"""

# 创建元组迭代器，配合__next__()访问下一个
"""
tuple1 = (10,20,30,40,50,"刘兆",'刘超')
# 创建迭代器对象
iter_tup = tuple1.__iter__()
#访问下一个值     next 和__next__()是一样的方法
print(next(iter_tup))  # 10
print(next(iter_tup))  # 20
print(next(iter_tup))  # 30
"""
# 通过字典创建迭代器，配合__next__进行访问下一个
"""
dic = {"x":1,'y':2,'z':3}
# 可迭代对象变成迭代器
iter_dic = dic.__iter__()
# print(iter_dic)     # 直接打印，会是地址值
# 配合next进行访问下一个
print(iter_dic.__next__())  #  x
print(iter_dic.__next__())  #  y
print(iter_dic.__next__())  #  z
# print(iter_dic.__next__())  #  当都取空了以后，就会报错
"""

# 有一个误区,下面的代码相当于每次都是创建了一个新的迭代器，去拿它的值
"""
l1 = [10,20,0,30,40,'刘超','班长']
print(l1.__iter__().__next__())  # 10
print(l1.__iter__().__next__()) # 10
print(l1.__iter__().__next__())# 10
print(l1.__iter__().__next__())# 10
"""
# 创建一个range迭代器
range_ = range(0,20)
r_iter = range_.__iter__()

# 访问下一个值
print(r_iter.__next__())  # 0
print(r_iter.__next__())  # 1
# 分隔符
print("========================")

# 接着range迭代器循环
"""
for i in r_iter:
    print(i)
"""
# 遍历range
for i in range_:
    print(i)
"""
for循环它会把要遍历的对象，变成迭代器，再去访问取值
迭代器对象取空了以后，后面是会报错的，为什么for没有报错？
try捕捉异常，如果说最后一个出现了，出现错误的时候不会报错

"""



